home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
misc.s
< prev
next >
Wrap
Text File
|
1999-12-19
|
10KB
|
446 lines
.include doscall.mac
.include srammap.equ
.include global.mac
;----------------------------------------------------------------
;フレーム数をMSF形式の文字列に変換する
;<d0.l:フレーム数
;<a0.l:バッファの先頭
;>d0.l:フレーム数(MSF形式)
;>a0.l:文字列の末尾の0の位置
.text
.align 4,$2048
frm2str_len::
sub.l #75*2,d0 ;frm2msfが2秒増やしてしまうので調整しておく
bsr frm2msf
bra tim2str_len
;----------------------------------------------------------------
;MSF形式のフレーム番号を文字列に変換する
;<d0.l:フレーム番号(MSF形式)
;<a0.l:バッファの先頭
;>a0.l:文字列の末尾の0の位置
.text
.align 4,$2048
tim2str_len::
move.l d0,-(sp)
move.b #"'",(2,a0)
move.b #'"',(5,a0)
bra @f
tim2str_pos::
move.l d0,-(sp)
move.b #':',(2,a0)
move.b #':',(5,a0)
@@: moveq.l #100,d0
add.b (1,sp),d0
move.b (tim2str_table_10-100,pc,d0.l),(a0)+
move.b (tim2str_table_1-100,pc,d0.l),(a0)+
addq.l #1,a0
moveq.l #100,d0
add.b (2,sp),d0
move.b (tim2str_table_10-100,pc,d0.l),(a0)+
move.b (tim2str_table_1-100,pc,d0.l),(a0)+
addq.l #1,a0
moveq.l #100,d0
add.b (3,sp),d0
move.b (tim2str_table_10-100,pc,d0.l),(a0)+
move.b (tim2str_table_1-100,pc,d0.l),(a0)+
clr.b (a0)
move.l (sp)+,d0
rts
tim2str_table_10:
.irp c,'0','1','2','3','4','5','6','7','8','9'
.dc.b c,c,c,c,c,c,c,c,c,c
.endm
tim2str_table_1:
.rept 10
.dc.b '0123456789'
.endm
.even
;----------------------------------------------------------------
;アスキーコードで表示できない文字を'\x??'に変換してバッファに書き込む
;<d0.b:文字
;<a0.l:バッファ
;>a0.l:バッファの次の位置(+1または+4される)
.text
.align 4,$2048
encode_esc::
cmp.b #' ',d0
blo 1f
cmp.b #$7E,d0
bhi 1f
move.b d0,(a0)+
rts
1: move.b #'\',(a0)+
move.b #'x',(a0)+
move.l d1,-(sp)
.rept 2
rol.b #4,d0
moveq.l #$0F,d1
and.b d0,d1
move.b (7f,pc,d1.l),(a0)+
.endm
move.l (sp)+,d1
rts
7: .dc.b '0123456789abcdef'
;----------------------------------------------------------------
;文字列を指定されたバイト数だけ[~]で括ってコピーする
;<d0.w:コピーするバイト数-1
;<a0.l:コピー先バッファの先頭
;<a1.l:コピーする文字列の先頭
;>a0.l:コピー先の文字列の末尾の0の位置
;>a1.l:コピーした文字列の末尾+1
.text
.align 4,$2048
strncpy_name::
move.b #'[',(a0)+
1: move.b (a1)+,(a0)+ ;CD名をコピー
dbeq d0,1b
bne 3f
subq.l #1,a0
2: move.b #' ',(a0)+
dbra d0,2b
3: move.b #']',(a0)+
clr.b (a0)
rts
.if 0
;----------------------------------------------------------------
;MSF形式の数値のインクリメント
;<d0.l:mm:ss:ff
;>d0.l:mm:ss:ff
.text
.align 4,$2048
incmsf::
cmp.b #75-1,d0
bcc @f
addq.b #1,d0
rts
@@: cmp.w #(60-1)<<8,d0
bcc @f
add.w #(1<<8)-(75-1),d0
rts
@@: add.l #(1<<16)-((60-1)<<8)-(75-1),d0
rts
;----------------------------------------------------------------
.endif
.if 0
;----------------------------------------------------------------
;MSF形式の数値のデクリメント
; アンダーフローは無視しているので,00:00:01以上の数値を指定すること
;<d0.l:mm:ss:ff
;>d0.l:mm:ss:ff
.text
.align 4,$2048
decmsf::
tst.b d0
beq @f
subq.b #1,d0
rts
@@: cmp.w #1<<8,d0
blo @f
sub.w #(1<<8)-(75-1),d0
rts
@@: sub.l #(1<<16)-((60-1)<<8)-(75-1),d0
rts
;----------------------------------------------------------------
.endif
.if 0
;----------------------------------------------------------------
;MSF形式の数値の加算
;<d0.l:mm:ss:ff
;<d1.l:mm:ss:ff
;>d0.l:mm:ss:ff
.text
.align 4,$2048
addmsf::
movem.l d1-d2,-(sp)
;d0=|00|m0|s0|f0|
;d1=|00|m1|s1|f1|
add.b d1,d0 ;d0=|00|m0|s0|F2|
moveq.l #-75,d2
add.b d0,d2 ;d2=|..|..|..|f_|
bcc @f
move.b d2,d0 ;d0=|00|m0|s0|f2|
@@: clr.b d1 ;d1=|00|m1|s1|00|
addx.w d1,d0 ;d0=|00|m0|S2|f2|
move.w #(-60)<<8,d2
add.w d0,d2 ;d2=|..|..|s_|f2|
bcc @f
move.w d2,d0 ;d0=|00|m0|s2|f2|
@@: clr.w d1 ;d1=|00|m1|00|00|
addx.l d1,d0 ;d0=|00|M2|s2|f2|
movem.l (sp)+,d1-d2
rts
;----------------------------------------------------------------
.endif
;----------------------------------------------------------------
;フレーム番号をMSF形式からバイナリに変換する
;<d0.l:フレーム番号(mm:ss:ff,2秒以上)
;>d0.l:フレーム番号(0~)
.text
.align 4,$2048
msf2frm::
move.l d1,-(sp)
swap.w d0 ;ssff00mm
moveq.l #60,d1
mulu.w d0,d1 ;mm*60
clr.w d0 ;ssff0000
rol.l #8,d0 ;ff0000ss
add.w d0,d1 ;mm*60+ss ;18.2時間以上のときは.wでは不可
subq.w #2,d1 ;2秒減らす
mulu.w #75,d1 ;(mm*60+ss)*75 ; 〃
clr.w d0 ;ff000000
rol.l #8,d0 ;000000ff
add.l d1,d0 ;(mm*60+ss)*75+ff
move.l (sp)+,d1
rts
;----------------------------------------------------------------
;フレーム番号をバイナリからMSF形式に変換する
;<d0.l:フレーム番号(0~)
;>d0.l:フレーム番号(mm:ss:ff,2秒以上,フレーム番号が-150~のときは0秒以上)
.text
.align 4,$2048
frm2msf::
add.l #75*2,d0 ;2秒増やす(divu.wの前に行うこと)
divu.w #75,d0 ;18.2時間以上だとオーバーフローする
swap.w d0
move.w d0,-(sp) ;00ff
clr.w d0
swap.w d0
divu.w #60,d0 ;00ss00mm
swap.w d0 ;00mm00ss
lsl.w #8,d0 ;00mmss00
or.w (sp)+,d0 ;00mmssff
rts
;----------------------------------------------------------------
;サンプリング周波数(Hz)からTIMERD割り込み間隔(μs)を得る
;<d0.l:サンプリング周波数(Hz)
;<d1.l:1=モノラル,2=ステレオ
;>d0.l:TIMERD割り込み間隔(μs,20~50),-1=エラー
.text
.align 4,$2048
frequency_to_timerd_count::
movem.l d1/a0,-(sp)
lea.l (frequency_table_mono,pc),a0
cmp.l #1,d1
beq @f
lea.l (frequency_table_stereo,pc),a0
@@:
moveq.l #MAX_INT-MIN_INT,d1
1: cmp.l (a0)+,d0
dbeq d1,1b
bne 90f
moveq.l #MIN_INT,d0
add.b d1,d0
tst.l d0
99: movem.l (sp)+,d1/a0
rts
90: moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
;TIMERD割り込み間隔(μs)からサンプリング周波数(Hz)を得る
;<d0.b:TIMERD割り込み間隔(μs,20~50)
;<d1.l:1=モノラル,2=ステレオ
;>d0.l:サンプリング周波数(Hz),-1=エラー
.text
.align 4,$2048
timerd_count_to_frequency::
movem.l d1/a0,-(sp)
cmp.l #MIN_INT,d0
blo 99f
cmp.l #MAX_INT,d0
bhi 99f
lea.l (frequency_table_mono,pc),a0
cmp.l #1,d1
beq @f
lea.l (frequency_table_stereo,pc),a0
@@: moveq.l #MAX_INT,d1
sub.w d0,d1
add.w d1,d1
add.w d1,d1
move.l (a0,d1.w),d0
99: movem.l (sp)+,d1/a0
rts
90: moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
.text
.align 4,$2048
frequency_table_mono:
n = MAX_INT
.rept MAX_INT-MIN_INT+1
.dc.l (1000000+n/2)/n
n = n-1
.endm
.align 4,$2048
frequency_table_stereo:
n = MAX_INT
.rept MAX_INT-MIN_INT+1
.dc.l (1000000+n/2)/(n*2)
n = n-1
.endm
;----------------------------------------------------------------
;抑制つき表示
.text
.align 4,$2048
silent_eprintcrlf::
tst.b silent_flag
beq eprintcrlf
rts
.align 4,$2048
silent_eprint::
tst.b silent_flag
beq eprint
rts
.align 4,$2048
silent_eputchar::
tst.b silent_flag
beq eputchar
rts
.align 4,$2048
silent_ecrlf::
tst.b silent_flag
beq ecrlf
rts
;----------------------------------------------------------------
;エンディアンの変換(68000用)
; データの本体はバッファの先頭から後ろに1バイトずらした位置に用意しておくこと
; 68000専用,68030以降はローテート命令を使った方が速い
; movepを展開しないこと
;<d0.l:データの長さ(8の倍数)
;<a0.l:出力バッファの先頭=入力データの先頭-1
;?d0-d1/a0
.text
.align 4,$2048
convert_endian_68000::
subq.l #1,d0
bcs 99f ;データがない(念のため)
.if TEST_68000
.if 1 ;movepのルーチンをテストする
bra 9f
.else
IS68000 d1
beq 9f
.endif
swap.w d0
2: swap.w d0
1: move.b (2,a0),(a0)
addq.l #2,a0
dbra d0,1b
swap.w d0
dbra d0,2b
rts
9:
.endif
and.b #$F8,d0
move.l d0,d1
clr.b d1
sub.w d1,d0
lsr.l #8,d1
eori.b #$F8,d0
suba.w d0,a0
jmp (2f,pc,d0.w)
1: swap.w d1
2:
n = 0
.rept 32
movep.l (n+2,a0),d0 ;24
movep.l d0,(n,a0) ;24
;1ワードあたり12クロック
n = n+8
.endm
lea.l (256,a0),a0
dbra d1,2b
swap.w d1
dbra d1,1b
99: rts
;----------------------------------------------------------------
;SCSIのハード転送/ソフト転送を変更する
.text
.align 4,$2048
scsi_hard_soft_on::
tst.b hard_soft
bmi 99f
tst.b scsi_hard_soft_level
bne 10f
bsr sram_write_enable
bsr super
tst.b hard_soft
bne 1f
bclr.b #4,SRAM_SCSI_FLAG ;強制的にハード転送にする
bra 2f
1: bset.b #4,SRAM_SCSI_FLAG ;強制的にソフト転送にする
2:
sne.b scsi_hard_soft_old
bsr user
bsr sram_write_disable
10: addq.b #1,scsi_hard_soft_level
99: rts
.data
scsi_hard_soft_level:: .dc.b 0 ;0以外=ソフト転送
scsi_hard_soft_old: .dc.b 0 ;元のソフト転送モード
;----------------------------------------------------------------
;SCSIのハード転送/ソフト転送を元に戻す
.text
.align 4,$2048
scsi_hard_soft_off::
tst.b scsi_hard_soft_level
beq 99f
subq.b #1,scsi_hard_soft_level
bne @f
bsr sram_write_enable
bsr super
tst.b scsi_hard_soft_old
bne 1f
bclr.b #4,SRAM_SCSI_FLAG
bra 2f
1: bset.b #4,SRAM_SCSI_FLAG
2: bsr user
bsr sram_write_disable
99: rts
;----------------------------------------------------------------
;新規ファイルを書き込みモードでオープンする
;<a0.l:ファイル名
;>d0.l:ファイルハンドル,負数=エラー
.text
.align 4,$2048
wopen::
move.w #$0020,-(sp)
move.l a0,-(sp)
DOS _CREATE
addq.l #6,sp
tst.l d0
bpl @f
move.w #1,-(sp)
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0
@@: rts